#include "Nain.h"

#include <iomanip>

#include <boost/assign/list_of.hpp>

using namespace std;
using namespace boost::assign;

const unsigned Nain::nbrEnsembles = 4;

const unsigned Nain::nbrCapacites = 5;

const unsigned Nain::ppAlloues = 45;

const vector< vector< unsigned > > Nain::ensembleRacial =
  list_of< vector< unsigned> >
  ( list_of(13)( 1)( 2)( 4) )      // collines
  ( list_of(13)( 1)( 2)( 4) )      // montagnes
  ( list_of(13)( 1)( 2)( 4) )      // profondeurs
  ( list_of(13)( 1)( 4)( 2)(11) ); // gris

const unsigned Nain::taille = 24;

/**
 * Contient les capacités, puis les ensembles raciaux, à la fin.
 */
const vector< CapaciteRaciale > Nain::Liste = list_of
  (CapaciteRaciale("Bonus au contact"                  , 10))
  (CapaciteRaciale("Bonus au JS"                       , 10))
  (CapaciteRaciale("Brasseur"                          ,  5))
  (CapaciteRaciale("Détection des poisons"             ,  5))
  (CapaciteRaciale("Détection minière"                 , 10))
  (CapaciteRaciale("Détermination de l'ancienneté"     ,  5))
  (CapaciteRaciale("Analyse de stabilité"              ,  5))
  (CapaciteRaciale("Evaluation des gemmes"             ,  5))
  (CapaciteRaciale("Expert en marchandage"             ,  5))
  (CapaciteRaciale("Force augmentée"                   , 20))
  (CapaciteRaciale("Furtivité"                         , 10))
  (CapaciteRaciale("Fusion dans la pierre"             , 10))
  (CapaciteRaciale("Infravision"                       , 10))
  (CapaciteRaciale("Lien chthonien"                    ,  5))
  (CapaciteRaciale("Massif"                            , 10))
  (CapaciteRaciale("Pierres commères"                  , 10))
  (CapaciteRaciale("Résistant"                         , 10))
  (CapaciteRaciale("Résistance à l'illusion"           ,  5))
  (CapaciteRaciale("Talent pour les arbalètes"         ,  5))
  (CapaciteRaciale("Talent pour les épées courtes"     ,  5))
  (CapaciteRaciale("Talent pour les haches"            ,  5))
  (CapaciteRaciale("Talent pour les marteaux de guerre",  5))
  (CapaciteRaciale("Talent pour les masses"            ,  5))
  (CapaciteRaciale("Talent pour les pics"              ,  5));

/**
 * Contient les ensembles raciaux.
 */
const vector< EnsembleCapacitesRaciales > Nain::Ensembles = list_of
  ( EnsembleCapacitesRaciales( "Nain des Collines"   , 40, ensembleRacial[0] ) )
  ( EnsembleCapacitesRaciales( "Nain des Montagnes"  , 40, ensembleRacial[1] ) )
  ( EnsembleCapacitesRaciales( "Nain des Profondeurs", 45, ensembleRacial[2] ) )
  ( EnsembleCapacitesRaciales( "Nain Gris"           , 45, ensembleRacial[3] ) );

const vector< Prerequis > Nain::Limites = list_of
  (Prerequis(0,  8, 18))
  (Prerequis(1,  3, 17))
  (Prerequis(2, 11, 18))
  (Prerequis(5,  3, 17));

/**
 * Les  Nains ont +1 en Constitution et -1 en Charisme.
 */
const map< unsigned, int > Nain::AjustTraits = map_list_of
  ( 2, 1 )
  ( 5, -1 );

/**
 * Constructeur simplifié, qui remplit simplement le conteneur des capacités.
 * Il est utilisé lors de la lecture d'un fichier XML.
 *
 * @param[in] cap conteneur des capacité
 */
Nain::Nain(const vector<unsigned>& cap)
  :Race("Nain")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;

  Capacites.assign( cap.begin(), cap.end() );
}

/**
 * Constructeur usuel, qui permet de créer un Nain en sélectionnant
 * ses capacités.
 *
 * @param[in, out] PP nombre de pp, passé en argument afin de pouvoir
 * récupérer les pp non dépensé
 */
Nain::Nain(unsigned& PP)
  :Race("Nain")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;

  blank() << setfill('*') << setw(56) << '*' << endmsg;
  blank() << "Création d'un nain" << endmsg << endmsg;

  PP += 45;
  construitRace( PP );
  
  blank() << endmsg << setfill('*') << setw(56) << '*' << endmsg;
}

Nain::Nain()
  :Race("Nain")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;
}

/**
 * Constructeur de "copie", qui permet de créer une instance à partir
 * de MetaClasse.
 *
 * @param[in] ptr pointeur sur l'instance à copier.
 */
Nain::Nain(Race *ptr)
  : Race( *ptr )
{}

/**
 * Destructeur, ne fait rien de spécial.
 */
Nain::~Nain()
{}
